import 'package:get/get.dart';
import 'package:sp_util/sp_util.dart';
import 'package:pedometer/pedometer.dart';
import 'package:permission_handler/permission_handler.dart';
import 'dart:math';
import 'dart:async';
import 'package:flutter/material.dart';

class HomeLogic extends GetxController {
  final waterCount = 0.obs;
  final stepCount = 0.obs;
  final dailyQuote = ''.obs;
  final quoteColor = Color(0xFF000000).obs;

  final yesterdayWaterCount = 0.obs;
  final waterComparison = ''.obs;
  final waterAdvice = ''.obs;

  Stream<StepCount>? _stepCountStream;
  DateTime? _lastResetDate;

  final List<String> quotes = [
    "今天的努力，是明天的底气。",
    "不要等待机会，而要创造机会。",
    "成功不是将来才有的，而是从决定去做的那一刻起，持续累积而成。",
    "每一个不曾起舞的日子，都是对生命的辜负。",
    "当你感到悲伤时，最好是去学些什么东西。学习会使你永远立于不败之地。",
    "没有口水与汗水，就没有成功的泪水。",
    "做你害怕做的事，害怕就会消失。",
    "强大的信心，能克服来自内心的恐惧。",
    "世上没有绝望的处境，只有对处境绝望的人。",
    "如果你想要彩虹，那么你必须忍受雨水。",
    "成功的秘诀是坚持既定的目标。",
    "千里之行，始于足下。",
    "即使是最黑暗的夜晚，星星也在闪耀着光芒。",
    "相信自己，你比想象中更强大。",
    "生活如音乐，应该由你自己谱写。",
    "坚持最能打动人心的舞蹈，挫折是人生最好的教科书。",
    "一个人可以失败很多次，但是只要他没有开始责怪别人，他还不是一个失败者。",
    "成功的道路上，最重要的是不要停下来。",
    "懒惰是距离目标最远的路。",
    "路是脚踏出来的，历史是人写出来的。人的每一步行动都在书写自己的历史。",
    "生活中最难的阶段不是没有人懂你，而是你不懂自己。",
    "不管多么险峻的高山，总是为不畏艰难的人留下一条攀登的路。",
    "当机会来临时，你已经准备好了。",
    "你的态度决定你的高度。",
    "每天都是一个新的开始，每刻都值得好好珍惜。",
    "没有人能给你力量，你要自己去拿。",
    "努力不一定成功，但放弃一定失败。",
    "不要因为一次失败，就放弃你原来决心想达到的目的。",
    "最困难的时候，也就是离成功不远的时候。",
    "人生就像一场马拉松，获胜的关键不在于瞬间的爆发，而在于途中的坚持。",
    "勇气是控制恐惧，而不是没有恐惧。",
    "不要轻言放弃，今天放弃的，很可能是明天最需要的。",
    "智者一切求自己，愚者一切求他人。",
    "生活不是等待风暴过去，而是学会在雨中翩翩起舞。",
    "做自己生命的主角，不要总在别人的戏剧里充当配角。",
    "很多事先天注定，那是'命'；但你可以决定怎么面对，那是'运'。",
    "与其用泪水悔恨昨天，不如用汗水拼搏今天。",
    "坚持把简单的事情做好，你就会与众不同。",
    "宁可慢一点，不要停下来。",
    "再长的路，一步步也能走完；再短的路，不迈开双脚也无法到达。",
    "付出才会有收获，努力才会有成功。",
    "生命对某些人来说是美的，这些人的一生都为某个目标而奋斗。",
    "别想一下造出大海，必须先由小河川开始。",
    "失败只有一种，那就是半途而废。",
    "永不言弃，是成功者的最佳品格。",
    "只要你确信自己正确就去做，坚持到底就是胜利。",
    "伟人之所以伟大，是因为他与别人共处逆境时，别人失去了信心，他却下决心实现自己的目标。",
    "天再高又怎样，踮起脚尖就更接近阳光。",
    "没有天生的信心，只有不断培养的信心。",
    "只有经历过地狱般的折磨，才有征服天堂的力量。"
  ];

  @override
  void onInit() {
    super.onInit();
    loadWaterCount();
    initPedometer();
    generateDailyQuote();
    loadYesterdayWaterCount();
    checkAndResetData();
    updateWaterComparison();

    // 定时检查是否需要重置数据
    ever(waterCount, (_) {
      updateWaterComparison();
    });

    // 启动定时器，每分钟检查一次是否需要重置数据
    Timer.periodic(Duration(minutes: 1), (_) {
      checkAndResetData();
    });
  }

  void generateDailyQuote() {
    final random = Random();
    final index = random.nextInt(quotes.length);
    dailyQuote.value = quotes[index];

    int r = random.nextInt(150);
    int g = random.nextInt(150);
    int b = random.nextInt(150);

    int darkChannel = random.nextInt(3);
    if (darkChannel == 0) r = random.nextInt(50);
    else if (darkChannel == 1) g = random.nextInt(50);
    else b = random.nextInt(50);

    quoteColor.value = Color.fromRGBO(r, g, b, 1.0);
  }

  Future<void> initPedometer() async {
    if (await Permission.activityRecognition.request().isGranted) {
      _initStepCount();
    } else {
      Get.snackbar('权限提示', '需要活动权限来获取步数数据');
    }
  }

  void _initStepCount() {
    _stepCountStream = Pedometer.stepCountStream;
    _stepCountStream?.listen((StepCount event) {
      stepCount.value = event.steps;
      SpUtil.putInt('step_count', event.steps);
    }).onError((error) {
      Get.snackbar('错误', '无法获取步数: $error');
    });

    stepCount.value = SpUtil.getInt('step_count') ?? 0;
  }

  void loadWaterCount() {
    waterCount.value = SpUtil.getInt('water_count') ?? 0;
    _lastResetDate = DateTime.fromMillisecondsSinceEpoch(
        SpUtil.getInt('last_reset_date') ?? DateTime.now().millisecondsSinceEpoch
    );
  }

  void loadYesterdayWaterCount() {
    yesterdayWaterCount.value = SpUtil.getInt('yesterday_water_count') ?? 0;
  }

  void saveWaterCount() {
    SpUtil.putInt('water_count', waterCount.value);
  }

  void increaseWaterCount() {
    if (waterCount.value < 8) {
      waterCount.value++;
      saveWaterCount();
    }
  }

  void decreaseWaterCount() {
    if (waterCount.value > 0) {
      waterCount.value--;
      saveWaterCount();
    }
  }

  void checkAndResetData() {
    final now = DateTime.now();
    final today = DateTime(now.year, now.month, now.day);
    final lastResetDay = DateTime(
        _lastResetDate!.year,
        _lastResetDate!.month,
        _lastResetDate!.day
    );

    if (today.isAfter(lastResetDay)) {
      // 存储昨天的饮水量
      SpUtil.putInt('yesterday_water_count', waterCount.value);
      yesterdayWaterCount.value = waterCount.value;

      // 重置今天的饮水量
      waterCount.value = 0;
      SpUtil.putInt('water_count', 0);

      // 更新最后重置日期
      _lastResetDate = now;
      SpUtil.putInt('last_reset_date', now.millisecondsSinceEpoch);

      // 重置步数
      stepCount.value = 0;
      SpUtil.putInt('step_count', 0);

      // 更新饮水比较信息
      updateWaterComparison();

      // 生成新的每日一言
      generateDailyQuote();
    }
  }

  void updateWaterComparison() {
    if (yesterdayWaterCount.value == 0) {
      waterComparison.value = "昨日无饮水记录";
      waterAdvice.value = "建议每天饮水6-8杯";
    } else if (waterCount.value > yesterdayWaterCount.value) {
      waterComparison.value = "今日饮水量超过昨天";
      waterAdvice.value = "继续保持良好的饮水习惯";
    } else if (waterCount.value < yesterdayWaterCount.value) {
      waterComparison.value = "今日饮水量少于昨天";
      waterAdvice.value = "多喝水有助于健康，建议增加饮水量";
    } else {
      waterComparison.value = "今日饮水量与昨天持平";
      waterAdvice.value = "保持稳定的饮水习惯很好";
    }
  }
}